#include <unistd.h> // 提供对 POSIX 操作系统 API 的访问，例如 read 函数
#include <stdio.h>  // 提供输入输出功能
#include <sys/types.h> // 提供一些数据类型，例如 ssize_t
#include <string.h>
#include <signal.h> // 提供信号处理功能

#define INPUTLEN 20 // 定义输入缓冲区长度
char input[INPUTLEN]; // 声明输入缓冲区

// 定义 SIGINT 信号的处理函数
void inthandler(int s) {
    printf("I have Received signal %d.. waiting\n", s); // 打印接收到的信号编号并等待
    sleep(2); // 等待2秒
    printf("I am Leaving inthandler \n"); // 打印离开处理函数的消息
    signal(SIGINT, inthandler); // 重新设置 SIGINT 信号的处理函数为自身（递归调用注意）
}

// 定义 SIGQUIT 信号的处理函数
void quithandler(int s) {
    printf("I have Received signal %d.. waiting\n", s); // 打印接收到的信号编号并等待
    sleep(3); // 等待3秒
    printf("I am Leaving quithandler \n"); // 打印离开处理函数的消息
    signal(SIGQUIT, quithandler); // 重新设置 SIGQUIT 信号的处理函数为自身（递归调用注意）
}

int main() {
    signal(SIGINT, inthandler); // 设置 SIGINT（通常是 Ctrl+C）信号的处理函数为 inthandler
    signal(SIGQUIT, quithandler); // 设置 SIGQUIT（通常是 Ctrl+\）信号的处理函数为 quithandler

    do {
        printf("please input a message\n"); // 提示用户输入消息
        ssize_t nchars = read(0, input, INPUTLEN-1); // 从标准输入（键盘）读取输入到缓冲区
        if (nchars == -1) {
            perror("read returned an error"); // 如果读取失败，打印错误信息
        } else {
            input[nchars] = '\0'; // 在字符串末尾添加结束符
            printf("You have inputed: %s\n", input); // 打印用户输入的消息
        }
    } while (strncmp(input, "quit", 4) != 0); // 如果用户输入的不是 "quit"，则继续循环

    return 0; // 程序正常结束
}

